筆記目錄

Skip to content

Elasticsearch QueryString 查詢語法筆記

TLDR

  • query_string 是基於 Lucene 的查詢語法,適合快速檢索。
  • 英文運算子(AND, OR, NOT)必須大寫。
  • 針對 keyword 欄位或數值/日期/布林欄位進行多詞搜尋時,必須使用雙引號或 OR 運算子,否則會因無法拆分而查不到資料。
  • 比較運算子(>, >=, <, <=)在搭配 fields 參數時會報錯,應改用範圍查詢語法([x TO y])。
  • 日期查詢若包含冒號(如標準 ISO 格式),必須使用雙引號包覆。
  • 日期欄位不支援比較運算子,請一律使用範圍查詢語法。
  • 模糊搜尋(~)與近似搜尋(~N)的參數設定,會被查詢字串中的具體值覆蓋。
  • 欄位加權(^)與查詢層級 boost 參數作用範圍不同,前者影響欄位間相對權重,後者影響複合查詢中子句的權重。

基本 API 結構

在 Elasticvue 或 Kibana Discover 等工具中,query_string 提供了一種比 DSL 更簡潔的查詢方式。

json
{
  "query": {
    "query_string": {
      "query": "your query string here",
      "default_field": "content",
      "default_operator": "OR"
    }
  },
  "size": 10,
  "from": 0,
  "sort": []
}

查詢語法與欄位型別限制

什麼情況下會遇到這個問題:當你對 keyword 或數值欄位進行多詞查詢時,常會發現查不到資料。

Elasticsearch 對不同欄位型別有不同的分析策略。query_string 會依據目標欄位型別選擇處理方式:

  • text 欄位:使用 standard 分析器,會分詞並轉小寫。
  • keyword 欄位:保持完整字串不變。
  • 數值/日期/布林欄位:不使用分析器,索引原始值。
欄位類型查詢字串行為說明
textapple banana等同 apple OR banana
keywordapple banana查不到(被視為完整字串比對)
數值/日期123 456查不到(不會自動拆分)

解決方案:針對 keyword 或數值欄位,請使用雙引號明確指定或使用 OR 運算子:

json
{
  "query": {
    "query_string": {
      "query": "\"apple\" \"banana\""
    }
  }
}

範圍查詢與比較運算子

什麼情況下會遇到這個問題:當你嘗試使用 fields 參數並搭配比較運算子(如 price:>=10)時,查詢會失敗。

比較運算子(>>=<<=)在搭配 fields 陣列參數時會產生錯誤。

建議做法:改用範圍查詢語法([x TO y]),此語法與 fields 參數完全相容。

json
{
  "query": {
    "query_string": {
      "query": "[10 TO *]",
      "fields": ["price"]
    }
  }
}

日期時間查詢注意事項

什麼情況下會遇到這個問題:當你使用標準日期格式(包含冒號)或嘗試對日期欄位使用比較運算子時。

  • 格式限制:標準格式(如 2023-01-15T08:30:00Z)包含冒號,必須使用雙引號包覆,否則會解析錯誤。
  • 比較運算子限制:日期欄位不支援比較運算子,若使用會導致查詢失效或報錯。

正確做法:一律使用範圍查詢語法。

json
{
  "query": {
    "query_string": {
      "query": "timestamp:[2023-01-15T08:30:00Z TO *]"
    }
  }
}

權重控制:Boost 與欄位加權

什麼情況下會遇到這個問題:當你需要調整搜尋結果的排序權重時。

  • 欄位加權(Field Boost):使用 ^ 語法。例如 title^3 表示該欄位的基礎分數會被放大 3 倍。
  • 查詢層級 Boost:使用 boost 參數。主要用於 bool 查詢中的 should 子句,調整不同查詢條件的相對重要性。

關鍵差異

  • 欄位加權作用於單一查詢內的不同欄位。
  • 查詢 boost 作用於複合查詢中的不同子句。
  • 若單獨使用一個查詢,boost 參數對排序沒有影響。

模糊搜尋與近似搜尋

什麼情況下會遇到這個問題:當你設定了全域 fuzzinessphrase_slop 參數,卻發現查詢結果不符合預期。

波浪號 ~ 的用途取決於位置:

  • 單詞後(模糊搜尋):處理拼寫錯誤。fuzziness 參數必須搭配查詢字串中的 ~ 才會生效。
  • 片語後(近似搜尋):處理詞序與距離。phrase_slop 控制詞彙移動的最小步數。

重要規則:查詢字串中明確設定的值(如 apple~2)會覆蓋 API 參數中的全域設定。

異動歷程

  • 2025-04-13 初版文件建立。
  • 2025-10-03
    • 修正語句用詞,統一使用台灣慣用語。
    • 修正日期查詢範圍語法說明(日期欄位不支援比較運算子,應使用範圍查詢語法)。
    • 修正權重計算遺漏欄位基礎分數的部分。
    • 補充技術細節。